package ru.toxsoft.l2.core.main;

import org.toxsoft.core.tslib.av.opset.*;
import org.toxsoft.core.tslib.utils.logs.*;

import ru.toxsoft.l2.core.app.*;
import ru.toxsoft.l2.core.dlm.*;
import ru.toxsoft.l2.core.hal.*;
import ru.toxsoft.l2.core.net.*;

/**
 * Контекст, в которой работают все компоненты.
 * <p>
 * Компоненты - это не DLM-модули, компоненты это большие части программы, которыми управляет главная программа
 * {@link L2CoreMain}. Сечас есть следующие компоненты: <br>
 * <ul>
 * <li>{@link INetwork} - сеть, обмен с верхним уровнем;</li>
 * <li>{@link IDlmManager} - менеджер управления загружаемыми модулями;</li>
 * <li>{@link IHal} - доступ к входам/выходам, консоли и вообще ко всему оборудованию блока управления.</li>
 * </ul>
 *
 * @author goga
 */
public interface IGlobalContext {

  /**
   * Глобальные (общие для всей программы) параметры настройки программы НУ.
   * <p>
   * <p>
   * В указанном наборе содержиться все параметры из перечисления {@link EGlobalOps}, а также все дополнительные
   * параметры, заданные в конфигурационном файле и в командной строке. При этом, если один и тот же парамтр задан
   * везде, то наивысший приоритет имеет параметры командной строки, далее параметры, заданные в конфигурационном файле,
   * и низший приоритет имеют значения по умолчанию из набора {@link EGlobalOps}.
   *
   * @return {@link IOptionSet} - глобавльные параметры настроек
   */
  IOptionSet globalOps();

  /**
   * Логер - спопоб логирования сообщении о работе программы.
   *
   * @return {@link ILogger} - логер для всех частей программы
   */
  @Deprecated
  ILogger logger();

  /**
   * Момент времени, когда программа начала работу.
   *
   * @return long -момент начала работы программы в миллисекундах
   */
  long startTime();

  /**
   * Возвращает компоненту доступа к оборудованию БУ.
   *
   * @return {@link IHal} - компонента доступа к оборудованию БУ
   */
  IHal hal();

  /**
   * Возвращает компоненту доступа к верхнему уровню и сети.
   *
   * @return {@link INetwork} - компонента доступа к верхнему уровню и сети
   */
  INetwork network();

  /**
   * Возвращает менеджер загружаемых модулей.
   *
   * @return {@link IDlmManager} - менеджер загружаемых модулей
   */
  IDlmManager dlmManager();

  /**
   * Возвращает API работы с функционалом, специфичным для конкретного проекта.
   *
   * @return Object - API работы с функционалом, специфичным для конкретного проекта.
   */
  IApp appApi();

}
